/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package mundo;

import objetos.Aldea;
import objetos.personajes.Personaje;

/**
 *
 * @author Yanire
 */
public class ControladorGestor {
    private GestorMapas gestor;

    public ControladorGestor(GestorMapas gestor){
        this.gestor = gestor;
    }

    /**
     * Devuelve la direccion referente al click.
     * Devuelve 3,6,9,12
     */

    public int transformarMouse(int xMouse, int yMouse) {
        //Transforma las coordenadas relativas a la ventana y no al batallon.
        //Toma como referencia el punto (330,228) como el centro exacto donde está el batallón actual

	if ((xMouse >= 380) && (yMouse < 308)) {
            return 12;
        }
        if ((xMouse < 380) && (yMouse < 308)) {
            return 9;
        }
        if ((xMouse < 380) && (yMouse >= 308)) {
            return 6;
        }
        if ((xMouse >= 380) && (yMouse >= 308)) {
            return 3;
        }
        return 0;


    }

    /**
     * Devuelve la celda donde se dio el click.
     * Devuelve un arreglo de dos enteros [x,y] coordenadas de la celda.
     */

    public int[] inMouseOutCelda(int xMouse, int yMouse) {
        int turno = gestor.getTurno();
	int yCentro = gestor.getPersonajes()[turno].getY();
        int xCentro = gestor.getPersonajes()[turno].getX();
        int A = gestor.getDibujador().getA();
        int B = gestor.getDibujador().getB();

        int [] celda = new int[2];

	int i = 330; // posicion horizontal (pixel)
	int j = 100; // posicion vertical (pixel)
	int k = 0; // k-esima celda de la fila m a imprimir (matriz)
	int m = 0; // m-esima fila a imprimir (matriz)

	for (int x = xCentro - A; x <= (xCentro + A); x++) {
            m = 0;
            for (int y = yCentro - B; y <= (yCentro + B); y++) {

                if((xMouse>=gestor.getDibujador().getIsoX(i, k, m))&&(xMouse<(gestor.getDibujador().getIsoX(i, k, m)+45))&&
                        (yMouse>=gestor.getDibujador().getIsoY(j, k, m))&&(yMouse<(gestor.getDibujador().getIsoY(j, k, m)+20))){
                    celda[0] = x;
                    celda[1] = y;
                }
		m++;
	    }
	    k++;
	}
        return celda;
    }

   /**
     *Metodo que cambia el turno
     *
     */
    public void cambiarTurno() {
        gestor.setTurno(gestor.getRival());
    }

    /**
     *Metodo que devuelve si el turno actual es computadora
     *
     */
    public boolean esComputadora() {
        return !(gestor.getTurno() == gestor.getTurnoJugador());
    }


    /**
     *Metodo que imprime la informacion del bando actual en consola
     */
    public void sacarInfoBando() {
        int rival = gestor.getRival();
        int turno = gestor.getTurno();
        //    Imprime informacion del jugador actual
//        System.out.print("\nJugador - ");
//        if (gestor.getTurno() == 0) {
//            System.out.println("Patriotas:");
//        } else {
//            System.out.println("Realistas:");
//        }
//        System.out.print("Dinero: " + gestor.getBandos()[turno].getDinero() + " ");
//        System.out.print("Personajes: " + gestor.getBandos()[turno].getPersonajes().size() + " ");
//        System.out.print("Ataque Bat. Actual: " + gestor.getPersonajes()[turno].ataqueTotal() + " ");
//        System.out.print("Defensa Bat. Actual: " + gestor.getPersonajes()[turno].defensaTotal() + " ");
//        System.out.println("Vida Bat. Actual: " + gestor.getPersonajes()[turno].getVidaActual());
//        System.out.print("Cantidad Personajes: " +  " ");
//        System.out.print("Vida P. Principal: " + gestor.getBandos()[turno].getPersonajePrincipal().getVidaActual());
//        System.out.println("/" + gestor.getBandos()[turno].getPersonajePrincipal().getVidaMaxima());
//        System.out.println("X:" + gestor.getBandos()[turno].getPersonajePrincipal().getX());
//        System.out.println("Y:" + gestor.getBandos()[turno].getPersonajePrincipal().getY());
        //    Imprime informacion del rival
//        System.out.print("Rival - ");
//        if (turno != 0) {
//            System.out.println("Patriotas:");
//        } else {
//            System.out.println("Realistas:");
//        }
//        System.out.print("Dinero: " + gestor.getBandos()[rival].getDinero() + " ");
//        System.out.print("Batallones: " + gestor.getBandos()[rival].getPersonajes().size() + " ");
//        System.out.print("Ataque Bat. Actual: " + gestor.getPersonajes()[rival].ataqueTotal() + " ");
//        System.out.print("Defensa Bat. Actual: " + gestor.getPersonajes()[rival].defensaTotal() + " ");
//        System.out.println("Vida Bat. Actual: " + gestor.getPersonajes()[rival].getVidaActual());
//        System.out.print("Personajes: " +  gestor.getBandos()[rival].getPersonajes().size());
//        System.out.print("Vida P. Principal: " + gestor.getBandos()[rival].getPersonajePrincipal().getVidaActual());
//        System.out.println("/" + gestor.getBandos()[rival].getPersonajePrincipal().getVidaMaxima());
//        System.out.println("X:" + gestor.getBandos()[rival].getPersonajePrincipal().getX());
//        System.out.println("Y:" + gestor.getBandos()[rival].getPersonajePrincipal().getY());
    }

    /**
     * Metodo que saca cadena por cadena la info para colocarla en pantalla.
     */
    public String sacarInfoBando2(int i) {
        String cadena = new String();
        int turno = gestor.getTurno();
        //    Imprime informacion del jugador actual
        switch (i) {

            case 0:
                if (turno == 0) {
                    cadena = "Patriotas:\n";
                } else {
                    cadena = "Realistas:\n";
                }
                break;
            case 1:
                break;
            case 2:
                cadena += ("Tipo P.: " + gestor.getPersonajes()[turno].getClass().getSimpleName()+ "\n");
                break;
            case 3:
                cadena += ("Dinero: " + gestor.getBandos()[turno].getDinero() + " \n");
                break;
            case 4:
                cadena += ("Personajes: " + gestor.getBandos()[turno].getPersonajes().size() + " \n");
                break;
            case 5:
                cadena += ("Vida P. Principal: " + gestor.getBandos()[turno].getPersonajePrincipal().getVidaActual() + "\n");
                cadena += ("/" + gestor.getBandos()[turno].getPersonajePrincipal().getVidaMaxima() + "\n");

                break;
            case 6:
                //cadena += ("Cantidad Personajes: " + "\n");
                break;
            case 7:
                cadena += ("Vida P. Actual: " + gestor.getPersonajes()[turno].getVidaActual() + "\n");
                break;
            case 8:
                cadena += ("Ataque P. Actual: " + gestor.getPersonajes()[turno].ataqueTotal() + " \n");
                break;
            case 9:
                cadena += ("Defensa P. Actual: " + gestor.getPersonajes()[turno].defensaTotal() + " \n");
                break;
            case 10:
                cadena += ("Vida P.P.Enem.: " + gestor.getBandos()[gestor.getRival()].getPersonajePrincipal().getVidaActual() + "\n");
                cadena += ("/" + gestor.getBandos()[turno].getPersonajePrincipal().getVidaMaxima() + "\n");
                break;
            case 11:
                cadena += ("Personajes Enemigos: "  +  gestor.getBandos()[gestor.getRival()].getPersonajes().size());
                break;
            case 12:
                cadena += ("Vida P. Enemigo: " + gestor.getBandos()[gestor.getRival()].getPersonajePrincipal().getVidaActual() + "\n");
                break;
            case 13:
                cadena += ("Ataque P. Enemigo: " + gestor.getPersonajes()[gestor.getRival()].ataqueTotal() + " \n");
                break;
            case 14:
                cadena += ("Defensa P. Enemigo: " + gestor.getPersonajes()[gestor.getRival()].defensaTotal() + " \n");
                break;

        }

        return cadena;
    }

    /**
     * Metodo que asigna la celda a un personaje recien creado.
     */
    public void asignarCelda(Aldea aldea, Personaje personajeNuevo) {
        //  Get a las posiciones actuales de la aldea
        int x = aldea.getX();
        int y = aldea.getY();

        for (int x1 = -1; x1 <= 1; x1++) {
            for (int y1 = -1; y1 <= 1; y1++) {
                if (gestor.getMapa().esCeldaDeMapa(x + x1, y + y1) && gestor.getMapa().getCelda(x + x1, y + y1).getObjeto() == null) {
                    personajeNuevo.setX(x1 + x);
                    personajeNuevo.setY(y1 + y);
                    gestor.getMapa().modificaCelda(x1 + x, y1 + y, personajeNuevo);
                    return;
                }
            }
        }
    }

    public boolean hayEnemigoAdyacente(int direccion) {
        return gestor.getMapa().hayEnemigoAdyacente(gestor.getPersonajes()[gestor.getTurno()]) == direccion;
    }

    public boolean hayEnemigoAdyacente() {
        boolean hayenemigo = false;

        for(int i =0; i< gestor.getSeleccionado().size(); i++)
            hayenemigo = hayenemigo || (gestor.getMapa().hayEnemigoAdyacente(gestor.getSeleccionado().get(i))!=0);
        return hayenemigo;
    }

    public boolean hayAldeaAdyacente(int dir) {
        return gestor.getMapa().aldeaAdyacente(gestor.getPersonajes()[gestor.getTurno()], dir);
    }

    public int getDirAldea() {
        return gestor.getMapa().hayAldeaAdyacente(gestor.getPersonajes()[gestor.getTurno()]);
    }

}
